package com.itheima_01;

/**
 * @author fg
 * @date 2021/7/3
 */
public class demo_01 {
    public static void main(String[] args) {
/*
        源码：看数据
        反码：转数据
        补码：运行数据
        1.  130是十进制数，要转换成二进制数 ：10000010
        2.  整数默认int类型，占4个字节（1个字节=8个比特位），要在二进制数前面补全得到源码
        3.  int类型源码：00000000 00000000 00000000 10000010
        4.  byte强转：byte占1个字节，需要砍掉前面的3个字节：10000010
        5.  10000010参与运算，属于补码，补码推反码：首位为符号位（0为+，1为-）不变，末位-1：10000001
        6.  反码推源码：首位为符号位不变，其余取反（0和1互换）：11111110
        7.  源码11111110：首位为符号位，其余通过8421码转换成十进制数，输出这个十进制数结果为-126
*/
        byte b = (byte)130;
        System.out.println(b);
        System.out.println("-----------");
/*
        位运算：
        位运算特制的是二进制位的运算，先将十进制数转成二进制后再进行运算。
        在二进制位运算中，1表示true，0表示false。
        注意：参与运算的二进制均为补码形式！
        &：位与    遇false则false（遇0则0）
        |：位或    遇true则true（遇1则1）
        ^：位异或   相同false，不同为true（11得0,00的0,10得1）,一个数被另一个数异或2次，该数本身不变
        ^：位取反   包括符号位在内全部取反（0变1,1变0）
*/
        System.out.println(6 & 2);      //  2
        /*
            6的二进制表示：00000000 00000000 00000000 00000110
            2的二进制表示：00000000 00000000 00000000 00000010
            6 & 2        ：00000000 00000000 00000000 00000010   //参与运算：补码
            补码转源码   ：00000000 00000000 00000000 00000010    //正数的源码反码补码相同
            二进制转十进制：2
        */
        System.out.println(6 | 2);      //  6
        /*
            6的二进制表示：00000000 00000000 00000000 00000110
            2的二进制表示：00000000 00000000 00000000 00000010
            6 | 2        ：00000000 00000000 00000000 00000110
            补码转源码   ：00000000 00000000 00000000 00000110
            二进制转十进制：6
         */
        System.out.println(6 ^ 2);      //  4
        System.out.println(6 ^ 2 ^2);      //   6
        System.out.println(6 ^ 2 ^ 6);      //  2
        /*
            6的二进制表示：00000000 00000000 00000000 00000110
            2的二进制表示：00000000 00000000 00000000 00000010
            6 ^ 2        ：00000000 00000000 00000000 00000100
            补码转源码   ：00000000 00000000 00000000 00000100
            二进制转十进制：4
         */
        System.out.println(~ 6);        //  -7
        /*
            6的二进制表示：00000000 00000000 00000000 00000110
            ~6           ：11111111 11111111 11111111 11111001   //符号位也要取反
            补码转反码   ：11111111 11111111 11111111 11111000    //末位-1
            反码转源码   ：10000000 00000000 00000000 00000111    //符号位不变，其余取反
            二进制转十进制：-7
         */
        System.out.println("------------");
        /*
            位移运算符：
                <<
                有符号左移运算：二进制位向左移动，左边符号位丢弃，右边补齐0
                运算规律：向左移动几位就是乘以2的几次幂
                >>
                有符号右移运算：二进制位向右移动，使用符号位进行补位
                运算规律：向右移动几位就是除以2的几次幂
                >>>
                无符号右移运算：二进制位向右移动，无论符号位是0还是1，都用0进行补位
         */
        System.out.println(16 << 1);       //   32
        System.out.println(-16 << 2);       //  -64
        System.out.println(16 >> 1);        //  8
        System.out.println(-16 >> 2);       //  -4
        System.out.println(16 >>> 1);       //  8
        System.out.println(-16 >>> 2);      //  1073741820

    }
}
